package fr.miage.orleans.aar.modele.valueobject;

import fr.miage.orleans.aar.modele.Arbitre;

import java.util.List;

import fr.miage.orleans.aar.modele.ButMatch;
import fr.miage.orleans.aar.modele.ButTirAuBut;
import fr.miage.orleans.aar.modele.EtatMatchTour;
import fr.miage.orleans.aar.modele.MatchTour;

import java.util.ArrayList;
import java.util.Collection;

public final class ValueObjectMatch {

    private final int matchTourId;

    private final int numeroMatch;
    
    private final int tournoiId;

    private Collection<ValueObjectMatch> matchParents;

    private final EtatMatchTour etatMatch;

    private final Arbitre arbitre;

    private final ValueObjectEquipeMinimal equipeA;

    private final ValueObjectEquipeMinimal equipeB;

    private final boolean isAWinner;
    private final boolean isBWinner;

    private final int ScoreA;
    private final int ScoreB;
    private final List<ValueObjectButMatch> listButs;
    private final List<ValueObjectButTirAuBut> listTOB;

    private final String nomTournoi;

    private int rangMatch;

    private final String etatMatchString;

    public String getEtatMatchString() {
	return etatMatchString;
    }

    public ValueObjectMatch(MatchTour matchTour) {
	this.matchTourId = matchTour.getMatchTourId();
	this.numeroMatch = matchTour.getNumeroMatch();
	this.tournoiId = matchTour.getTournoi().getTournoiId();
	this.matchParents = new ArrayList<>();
	for (MatchTour aParent : matchTour.getParents()) {
	    this.matchParents.add(new ValueObjectMatch(aParent));
	}
	this.etatMatch = matchTour.getEtatMatch();
	this.etatMatchString = matchTour.getEtatMatch().toString();
	this.arbitre = matchTour.getArbitre();
	if (matchTour.getEquipeA() != null) {
	    this.equipeA = new ValueObjectEquipeMinimal(matchTour.getEquipeA());
	} else {
	    this.equipeA = null;
	}
	if (matchTour.getEquipeB() != null) {
	    this.equipeB = new ValueObjectEquipeMinimal(matchTour.getEquipeB());
	} else {
	    this.equipeB = null;
	}
	this.isAWinner = (this.etatMatch == EtatMatchTour.TERMINE_A_GAGNE);
	this.isBWinner = (this.etatMatch == EtatMatchTour.TERMINE_B_GAGNE);
	int _scoreA = 0;
	int _scoreB = 0;
	this.listButs = new ArrayList<>();
	for (ButMatch but : matchTour.getButsMatch()) {
	    if (but.getEquipe().getEquipeId() == matchTour.getEquipeA().getEquipeId()) {
		_scoreA++;
	    } else {
		_scoreB++;
	    }
	    this.listButs.add(new ValueObjectButMatch(but));
	}
	this.ScoreA = _scoreA;
	this.ScoreB = _scoreB;

	this.listTOB = new ArrayList<>();
	Collection<ButTirAuBut> butsTob = matchTour.getButsTirAuBut();
	for (ButTirAuBut but2 : butsTob) {
	    this.listTOB.add(new ValueObjectButTirAuBut(but2));
	}
	this.nomTournoi = matchTour.getTournoi().getNomTournoi();

	initGetRang();
    }

    public int getMatchTourId() {
	return matchTourId;
    }

    public int getNumeroMatch() {
	return numeroMatch;
    }

    public int getTournoiId() {
	return tournoiId;
    }
    
    /*
     public ValueObjectMatch getMatchEnfant() {
     return matchEnfant;
     }
     */

    public EtatMatchTour getEtatMatch() {
	return etatMatch;
    }

    public Arbitre getArbitre() {
	return arbitre;
    }

    public ValueObjectEquipeMinimal getEquipeA() {
	return equipeA;
    }

    public ValueObjectEquipeMinimal getEquipeB() {
	return equipeB;
    }

    public boolean isIsAWinner() {
	return isAWinner;
    }

    public boolean isIsBWinner() {
	return isBWinner;
    }

    public void initGetRang() {
	if (this.matchParents.isEmpty()) {
	    this.rangMatch = 1;
	} else {
	    ValueObjectMatch[] parentsArray = new ValueObjectMatch[this.matchParents.size()];
	    this.rangMatch = 1 + this.matchParents.toArray(parentsArray)[0].getRangMatch();
	}
    }

    public int getRangMatch() {
	return this.rangMatch;
    }

    public int getScoreA() {
	return ScoreA;
    }

    public int getScoreB() {
	return ScoreB;
    }

    public List<ValueObjectButMatch> getListButs() {
	return listButs;
    }

    public List<ValueObjectButTirAuBut> getListTOB() {
	return listTOB;
    }

    public String getNomTournoi() {
	return nomTournoi;
    }

    public Collection<ValueObjectMatch> getMatchParents() {
	return matchParents;
    }
    
    public boolean tirsAuButEquipeAGagne()
    {
    	int nbButEquipeA = 0;
		int nbButEquipeB = 0;
		int differenceButEntreEquipe = 0;
		int rang = getListTOB().size() / 2;
		for(ValueObjectButTirAuBut vob : getListTOB())
		{
			if(vob.isReussi() && vob.getEquipe().getId()==equipeA.getId())
				nbButEquipeA++;
			if(vob.isReussi() && vob.getEquipe().getId()==equipeA.getId())
				nbButEquipeB++;
		}
		
		if (nbButEquipeA>nbButEquipeB)
		{
			differenceButEntreEquipe=nbButEquipeA-nbButEquipeB;
		}
		else
		{
			differenceButEntreEquipe=nbButEquipeB-nbButEquipeA;
		}
    	return true;
    }

}
